package map;

import java.util.*;
import java.util.function.BiConsumer;

public class MapDemo2 {
    public static void main(String[] args) {
        Map<String,Integer> map= new HashMap<>();
        map.put("语文",40);
        map.put("数学",90);
        map.put("英语",-100);
        map.put("物理",80);
        map.put("化学",0);
        System.out.println(map);
        /*
        遍历所有的key
        Set<k> keySet()
        将当前Map中所有的key以一个Set集合形式返回，遍历这个集合就等于遍历了所有的key
         */
        Set<String> keySet= map.keySet();
        for (String key:keySet){
            System.out.println("key:"+key);
        }
        /*
        遍历每一组键值对
        Map.Entry它的每一个实例用于表示Map中的一组键值对
        Entry有两个常用的方法:
        getKey(),getValue()分别用于获取其表示的键值对中的ket和value
         */
        Set<Map.Entry<String,Integer>> entrySet=map.entrySet();
        for (Map.Entry<String,Integer> e:entrySet){
            String key=e.getKey();
            Integer value=e.getValue();
            System.out.println(key+":"+value);
        }
        /*
        遍历所有的value
        Collection<v>
         */
        Collection<Integer> values=map.values();
        for(Integer value:values){
            System.out.println("value:"+value);
        }

        /*
        JDK1.8之后集合和Map提供了一种新的遍历方式:基于lambda表达式遍历
        该方法为:forEach()
        集合中，forEach()方法会将集合每个元素都拿到并调用Consumer的accept方法陆续传入
        keySet.forEach(new Consumer<String>()){
        public void accept(String s){
            System.out.println(s);
         }
        }
         */
        keySet.forEach(s-> System.out.println(s));
        /*
        在lambda表达式中，如果参数与调用中传入的参数一致时，可以简写为方法的引用:
        e->对象.方法(e);
        可以写为:
        对象:方法
         */
        keySet.forEach(System.out::println);
        /*
        Map也提供了forEach
         */
        map.forEach(new BiConsumer<String, Integer>() {
            public void accept(String k, Integer v) {
                System.out.println(k+":"+v);
            }
        });
        map.forEach((k,v)->System.out.println(k+":"+v));

    }
}
